package com.cdp.web.controller.system;

import com.cdp.common.core.domain.AjaxResult;
import com.cdp.common.core.domain.entity.ExcelFileHistory;
import com.cdp.common.utils.SecurityUtils;
import com.cdp.system.dto.ExcelFileDTO;
import com.cdp.system.service.IExcelFileHistoryService;
import com.cdp.system.vo.ExcelFileHistoryVO;
import com.cdp.system.vo.UrlVO;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URI;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

@RestController
@RequestMapping
public class ExcelFileHistoryController {


    @Autowired
    private IExcelFileHistoryService excelFileHistoryService;


    /**
     * 查询历史记录
     * @return
     */
//    @GetMapping("queryExcelFileHistory")
//    public AjaxResult queryExcelFileHistory() {
//        // 获取所有 Excel 文件历史记录
//        List<ExcelFileHistory> list = excelFileHistoryService.list();
//
//        // 使用 stream 进行转换，将 ExcelFileHistory 转换为 ExcelFileHistoryVO
//        List<ExcelFileHistoryVO> voList = list.stream().map(excelFileHistory -> {
//            ExcelFileHistoryVO vo = new ExcelFileHistoryVO();
//            BeanUtils.copyProperties(excelFileHistory, vo);
//            return vo;
//        }).collect(Collectors.toList());
//
//        // 返回转换后的结果
//        return AjaxResult.success(voList);
//    }



    @PostMapping("queryExcelFileHistory")
    public AjaxResult queryExcelFileHistory(@RequestBody ExcelFileDTO excelFileDTO) {


        Long userId = SecurityUtils.getUserId();
        if(userId==null){
            return AjaxResult.error("获取userId异常，请重试！");
        }
        excelFileDTO.setUserId(userId);
        // 查询所有历史记录
    //    List<ExcelFileHistory> list = excelFileHistoryService.list();
        List<ExcelFileHistory> list = excelFileHistoryService.queryExcelFileHistory(excelFileDTO);
        // 转换为 VO
        List<ExcelFileHistoryVO> voList = list.stream().map(item -> {
            ExcelFileHistoryVO vo = new ExcelFileHistoryVO();
            BeanUtils.copyProperties(item, vo);
            return vo;
        }).collect(Collectors.toList());

        // 按 type 分组
        List<ExcelFileHistoryVO> mechanicalList = voList.stream()
                .filter(vo -> vo.getType() != null && vo.getType() == 0)
                .collect(Collectors.toList());

        List<ExcelFileHistoryVO> slumpList = voList.stream()
                .filter(vo -> vo.getType() != null && vo.getType() == 1)
                .collect(Collectors.toList());

        // 构建返回结果
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("mechanicalList", mechanicalList);
        resultMap.put("slumpList", slumpList);

        return AjaxResult.success(resultMap);
    }



//    @GetMapping("analysisExcelByUrl")
//    public AjaxResult analysisExcelByUrl(String fileUrl) {
//        try {
//            // 1. 判断系统并转换路径为 URL 格式
//            String os = System.getProperty("os.name").toLowerCase();
//            if (os.contains("win")) {
//                if (fileUrl.startsWith("C:\\") || fileUrl.startsWith("c:\\")) {
//                    fileUrl = "file:///" + fileUrl.replace("\\", "/");
//                }
//            } else {
//                if (fileUrl.startsWith("/")) {
//                    fileUrl = "file://" + fileUrl;
//                }
//            }
//
//            System.out.println("处理的文件 URL: " + fileUrl);
//
//            // 2. 加载文件
//            File file = new File(new URI(fileUrl));
//            if (!file.exists()) {
//                return AjaxResult.error("文件不存在: " + fileUrl);
//            }
//
//            URL url = new URL(fileUrl);
//            InputStream inputStream = url.openStream();
//            Workbook workbook = new XSSFWorkbook(inputStream);
//            Sheet sheet = workbook.getSheetAt(0);
//
//            List<List<String>> result = new ArrayList<>();
//
//            // 3. 遍历每一行
//            for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
//                Row row = sheet.getRow(rowIndex);
//                if (row == null) continue;
//
//                List<String> rowList = new ArrayList<>();
//                for (int colIndex = 0; colIndex < row.getLastCellNum(); colIndex++) {
//                    Cell cell = row.getCell(colIndex);
//                    rowList.add(getCellValue(cell));
//                }
//                result.add(rowList);
//            }
//
//            workbook.close();
//            inputStream.close();
//
//            return AjaxResult.success(result);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return AjaxResult.error("解析 Excel 文件失败: " + e.getMessage());
//        }
//    }
//
//
//    private String getCellValue(Cell cell) {
//        if (cell == null) return "";
//        switch (cell.getCellType()) {
//            case STRING:
//                return cell.getStringCellValue();
//            case NUMERIC:
//                if (DateUtil.isCellDateFormatted(cell)) {
//                    return cell.getDateCellValue().toString();
//                } else {
//                    return String.valueOf(cell.getNumericCellValue());
//                }
//            case BOOLEAN:
//                return String.valueOf(cell.getBooleanCellValue());
//            case FORMULA:
//                return cell.getCellFormula();
//            default:
//                return "";
//        }
//    }

    @PostMapping("analysisExcelByUrl")
    public AjaxResult analysisExcelByUrl(@RequestBody UrlVO urlVO) {
        String fileUrl = urlVO.getFileUrl();
        System.out.println("fileUrl哈哈哈" + fileUrl);
        try {
            // 1. 处理 OS 和路径
            String os = System.getProperty("os.name").toLowerCase();
            if (os.contains("win")) {
                if (fileUrl.startsWith("C:\\") || fileUrl.startsWith("c:\\")) {
                    fileUrl = "file:///" + fileUrl.replace("\\", "/");
                }
            } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
                if (fileUrl.startsWith("/")) {
                    fileUrl = "file://" + fileUrl;
                }
            }

            System.out.println("处理的文件 URL: " + fileUrl);

            // 2. 校验文件
            File file = new File(new URI(fileUrl));
            if (!file.exists()) {
                return AjaxResult.error("文件不存在: " + fileUrl);
            }

            // 3. 读取文件
            URL url = new URL(fileUrl);
            InputStream inputStream = url.openStream();
            Workbook workbook = new XSSFWorkbook(inputStream);
            Sheet sheet = workbook.getSheetAt(0);

            List<Map<String, String>> excelData = new ArrayList<>();

            // 4. 获取表头
            Row headerRow = sheet.getRow(0);
            if (headerRow == null) {
                return AjaxResult.error("表头为空");
            }

            List<String> headers = new ArrayList<>();
            for (Cell cell : headerRow) {
                headers.add(cell.getStringCellValue());
            }

            // 5. 读取数据行
            for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                Row row = sheet.getRow(rowIndex);
                if (row == null) continue;

                Map<String, String> rowData = new HashMap<>();
                for (int colIndex = 0; colIndex < headers.size(); colIndex++) {
                    Cell cell = row.getCell(colIndex);
                    String header = headers.get(colIndex);
                    String cellValue = getCellValue(cell);
                    rowData.put(header, cellValue);
                }
                excelData.add(rowData);
            }

            // 6. 关闭资源
            workbook.close();
            inputStream.close();

            // 返回解析后的 Excel 数据
            return AjaxResult.success(excelData);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("解析 Excel 文件失败: " + e.getMessage());
        }
    }
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DecimalFormat decimalFormat = new DecimalFormat("0.00");

        switch (cell.getCellType()) {
            case STRING:
                String raw = cell.getStringCellValue().trim();
                // 尝试解析字符串日期
                try {
                    // 支持 ISO 日期格式：2025-04-07T00:00
                    if (raw.matches("^\\d{4}-\\d{2}-\\d{2}T.*")) {
                        return raw.substring(0, 10);
                    }
                    // 支持 2025/04/07 格式
                    if (raw.matches("^\\d{4}/\\d{2}/\\d{2}$")) {
                        Date parsed = new SimpleDateFormat("yyyy/MM/dd").parse(raw);
                        return dateFormat.format(parsed);
                    }
                    // 支持纯数字 20250407
                    if (raw.matches("^\\d{8}$")) {
                        Date parsed = new SimpleDateFormat("yyyyMMdd").parse(raw);
                        return dateFormat.format(parsed);
                    }
                } catch (ParseException e) {
                    // 忽略错误，继续返回原始字符串
                }
                return raw;

            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return dateFormat.format(cell.getDateCellValue());
                } else {
                    return decimalFormat.format(cell.getNumericCellValue());
                }

            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());

            case FORMULA:
                try {
                    if (DateUtil.isCellDateFormatted(cell)) {
                        return dateFormat.format(cell.getDateCellValue());
                    } else {
                        return decimalFormat.format(cell.getNumericCellValue());
                    }
                } catch (Exception e) {
                    try {
                        return cell.getStringCellValue().trim();
                    } catch (Exception ex) {
                        return "";
                    }
                }

            case BLANK:
            default:
                return "";
        }
    }

/*
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DecimalFormat decimalFormat = new DecimalFormat("0.00");

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();

            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 处理日期格式，统一返回 "yyyy-MM-dd"
                    return dateFormat.format(cell.getDateCellValue());
                } else {
                    // 数字格式，保留两位小数
                    return decimalFormat.format(cell.getNumericCellValue());
                }

            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());

            case FORMULA:
                try {
                    if (DateUtil.isCellDateFormatted(cell)) {
                        // 处理日期格式，统一返回 "yyyy-MM-dd"
                        return dateFormat.format(cell.getDateCellValue());
                    } else {
                        // 数字格式，保留两位小数
                        return decimalFormat.format(cell.getNumericCellValue());
                    }
                } catch (Exception e) {
                    try {
                        return cell.getStringCellValue().trim();
                    } catch (Exception ex) {
                        return "";
                    }
                }

            case BLANK:
                return "";

            default:
                return "";
        }
    }
*/



/*
    @PostMapping("analysisExcelByUrl")
    public AjaxResult analysisExcelByUrl(@RequestBody UrlVO urlVO) {
        String fileUrl = urlVO.getFileUrl();
        System.out.println("fileUrl哈哈哈"+fileUrl);
        try {
            // 1. 处理 OS 和路径
            String os = System.getProperty("os.name").toLowerCase();
            if (os.contains("win")) {
                if (fileUrl.startsWith("C:\\") || fileUrl.startsWith("c:\\")) {
                    fileUrl = "file:///" + fileUrl.replace("\\", "/");
                }
            } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
                if (fileUrl.startsWith("/")) {
                    fileUrl = "file://" + fileUrl;
                }
            }

            System.out.println("处理的文件 URL: " + fileUrl);

            // 2. 校验文件
            File file = new File(new URI(fileUrl));
            if (!file.exists()) {
                return AjaxResult.error("文件不存在: " + fileUrl);
            }

            // 3. 读取文件
            URL url = new URL(fileUrl);
            InputStream inputStream = url.openStream();
            Workbook workbook = new XSSFWorkbook(inputStream);
            Sheet sheet = workbook.getSheetAt(0);

            List<Map<String, String>> excelData = new ArrayList<>();

            // 4. 获取表头
            Row headerRow = sheet.getRow(0);
            if (headerRow == null) {
                return AjaxResult.error("表头为空");
            }

            List<String> headers = new ArrayList<>();
            for (Cell cell : headerRow) {
                headers.add(cell.getStringCellValue());
            }

            // 5. 读取数据行
            for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                Row row = sheet.getRow(rowIndex);
                if (row == null) continue;

                Map<String, String> rowData = new HashMap<>();
                for (int colIndex = 0; colIndex < headers.size(); colIndex++) {
                    Cell cell = row.getCell(colIndex);
                    String header = headers.get(colIndex);
                    String cellValue = getCellValue(cell);
                    rowData.put(header, cellValue);
                }
                excelData.add(rowData);
            }

            // 6. 关闭资源
            workbook.close();
            inputStream.close();


//            HashMap<Object, Object> map = new HashMap<>();
//            map.put("excelData",excelData);
//            map.put("fileUrl",fileUrl);
//            map.put();


            return AjaxResult.success(excelData);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("解析 Excel 文件失败: " + e.getMessage());
        }
    }

    private String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DecimalFormat decimalFormat = new DecimalFormat("0.00");

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();

            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return dateFormat.format(cell.getDateCellValue());
                } else {
                    return decimalFormat.format(cell.getNumericCellValue());
                }

            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());

            case FORMULA:
                try {
                    if (DateUtil.isCellDateFormatted(cell)) {
                        return dateFormat.format(cell.getDateCellValue());
                    } else {
                        return decimalFormat.format(cell.getNumericCellValue());
                    }
                } catch (Exception e) {
                    try {
                        return cell.getStringCellValue().trim();
                    } catch (Exception ex) {
                        return "";
                    }
                }

            case BLANK:
                return "";

            default:
                return "";
        }
    }
*/



/*
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();

            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 日期格式化
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 可改为 yyyy-MM-dd HH:mm:ss
                    return dateFormat.format(date);
                } else {
                    // 数字保留两位小数
                    DecimalFormat decimalFormat = new DecimalFormat("0.00");
                    return decimalFormat.format(cell.getNumericCellValue());
                }

            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());

            case FORMULA:
                try {
                    // 尝试作为数值处理公式结果
                    DecimalFormat decimalFormat = new DecimalFormat("0.00");
                    return decimalFormat.format(cell.getNumericCellValue());
                } catch (IllegalStateException e) {
                    return cell.getStringCellValue();
                }

            default:
                return "";
        }
    }
*/

    // 工具方法：获取 Cell 内容
//    private String getCellValue(Cell cell) {
//        if (cell == null) return "";
//        switch (cell.getCellType()) {
//            case STRING:
//                return cell.getStringCellValue();
//            case NUMERIC:
//                if (DateUtil.isCellDateFormatted(cell)) {
//                    // 格式化日期为 yyyy-MM-dd 或其他格式
//                    Date date = cell.getDateCellValue();
//                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 可改成 yyyy-MM-dd HH:mm:ss
//                    return dateFormat.format(date);
//                } else {
//                    // 处理数值：防止科学计数法
//                    BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
//                    return bd.stripTrailingZeros().toPlainString();
//                }
//            case BOOLEAN:
//                return String.valueOf(cell.getBooleanCellValue());
//            case FORMULA:
//                return cell.getCellFormula();
//            default:
//                return "";
//        }
//    }
//








}
